// scripts/draft-changeset.js
import { exec } from '../utils/exec.js';
import { Logger } from '../utils/logger.js';
import clipboardy from 'clipboardy';

const logger = new Logger('[draft-changeset]');

// 剪贴板复制函数
async function copyToClipboard(text) {
  try {
    await clipboardy.write(text);
    return true;
  } catch (error) {
    return false;
  }
}

// 获取最新的版本标签
function getLatestTag() {
  try {
    // 获取最新的版本标签
    exec('git fetch --tags', {
      encoding: 'utf-8',
      stdio: 'pipe',
      silent: true,
      ignoreError: true,
    });
    // 获取最新的版本标签
    const tag = exec('git describe --tags --abbrev=0', {
      encoding: 'utf-8',
      stdio: 'pipe',
      silent: true,
      ignoreError: true,
    }).trim();
    return tag;
  } catch (error) {
    return null;
  }
}

// 获取提交记录
function getCommits(mode, count) {
  let command;

  if (mode === 'tag') {
    const latestTag = getLatestTag();
    if (latestTag) {
      logger.info(`📌 从版本 ${latestTag} 以来的变更：\n`);
      command = `git log --oneline --no-merges ${latestTag}..HEAD`;
    } else {
      logger.warning('没有找到版本标签，显示最近 30 条提交：\n');
      command = 'git log --oneline --no-merges -30';
    }
  } else {
    logger.info(`📝 最近 ${count} 条提交记录：\n`);
    command = `git log --oneline --no-merges -${count}`;
  }

  try {
    const commits = exec(command, {
      encoding: 'utf-8',
      stdio: 'pipe',
    }).trim();
    return commits;
  } catch (error) {
    return '';
  }
}

// 解析命令行参数
function parseArgs() {
  const args = process.argv.slice(2);

  // 默认配置
  let config = {
    mode: 'count',
    count: 10,
  };

  if (args.length > 0) {
    const arg = args[0];

    // 检查是否是数字
    if (/^\d+$/.test(arg)) {
      config.count = parseInt(arg);
      config.mode = 'count';
    }
    // 检查是否是 --tag 或 -t 参数
    else if (arg === '--tag' || arg === '-t' || arg === 'tag') {
      config.mode = 'tag';
    }
    // 显示帮助信息
    else if (arg === '--help' || arg === '-h') {
      showHelp();
      process.exit(0);
    }
  }

  return config;
}

// 显示帮助信息
function showHelp() {
  logger.info(`
📚 draft-changeset 使用说明
============================

用法：
  pnpm draft [options]

选项：
  [数字]     显示最近的 N 条提交（例如：pnpm draft 20）
  tag, -t    显示自上个版本标签以来的所有提交
  -h, --help 显示帮助信息

示例：
  pnpm v:draft        # 默认显示最近 10 条提交
  pnpm v:draft 20     # 显示最近 20 条提交
  pnpm v:draft tag    # 显示自上个版本以来的提交
  pnpm v:draft -t     # 同上

配置 package.json：
  "scripts": {
    "v:draft": "pnpm --filter @jtronic/scripts version-draft"
  }
  `);
}

// 主函数
function generateChangesetDraft() {
  const config = parseArgs();

  logger.info('\n🔍 分析提交历史...\n');
  logger.info('================================\n');

  // 获取提交记录
  const commits = getCommits(config.mode, config.count);

  if (!commits) {
    logger.error('没有找到提交记录\n');
    return;
  }

  // 解析并分类 commits
  const features = [];
  const fixes = [];
  const chores = [];
  const others = [];
  let breakingChanges = [];

  commits.split('\n').forEach((commit) => {
    // 检查是否包含 BREAKING CHANGE
    if (commit.toLowerCase().includes('breaking')) {
      breakingChanges.push(commit);
    }

    // 分类提交
    if (commit.match(/feat(?:\(.*?\))?:/i)) {
      const match = commit.match(/feat(?:\(.*?\))?:\s*(.+)/i);
      if (match) features.push(match[1]);
    } else if (commit.match(/fix(?:\(.*?\))?:/i)) {
      const match = commit.match(/fix(?:\(.*?\))?:\s*(.+)/i);
      if (match) fixes.push(match[1]);
    } else if (commit.match(/chore(?:\(.*?\))?:/i)) {
      const match = commit.match(/chore(?:\(.*?\))?:\s*(.+)/i);
      if (match) chores.push(match[1]);
    } else {
      const match = commit.match(/^\w+\s+(.+)/);
      if (match) others.push(match[1]);
    }
  });

  // 构建 summary 文本
  let summaryText = '';

  // 如果有 breaking changes，优先显示
  if (breakingChanges.length > 0) {
    summaryText += '⚠️ BREAKING CHANGES:\n';
    breakingChanges.forEach((bc) => {
      const match = bc.match(/^\w+\s+(.+)/);
      if (match) summaryText += `- ${match[1]}\n`;
    });
    summaryText += '\n';
  }

  if (features.length > 0) {
    summaryText += '✨ Features:\n';
    features.forEach((f) => {
      summaryText += `- ${f}\n`;
    });
  }

  if (fixes.length > 0) {
    if (summaryText) summaryText += '\n';
    summaryText += '🐛 Bug Fixes:\n';
    fixes.forEach((f) => {
      summaryText += `- ${f}\n`;
    });
  }

  if (chores.length > 0 && config.mode === 'tag') {
    // 只在查看版本标签时显示 chore
    if (summaryText) summaryText += '\n';
    summaryText += '🔧 Chores:\n';
    chores.forEach((c) => {
      summaryText += `- ${c}\n`;
    });
  }

  if (others.length > 0) {
    if (summaryText) summaryText += '\n';
    summaryText += '📦 Other Changes:\n';
    others.forEach((o) => {
      summaryText += `- ${o}\n`;
    });
  }

  // 如果没有符合格式的 commit，生成默认模板
  if (!summaryText) {
    summaryText = 'Various improvements and bug fixes';
  }

  // 显示统计信息
  logger.info('📊 提交统计：');
  logger.info(`  - Features: ${features.length}`);
  logger.info(`  - Fixes: ${fixes.length}`);
  logger.info(`  - Others: ${others.length + chores.length}`);
  if (breakingChanges.length > 0) {
    logger.info(`  - ⚠️  Breaking Changes: ${breakingChanges.length}`);
  }
  logger.blank();

  // 打印生成的 summary
  logger.info('📝 生成的 Changeset Summary:\n');
  logger.info('----------------------------');
  logger.info(summaryText);
  logger.info('----------------------------\n');

  // 复制到剪贴板
  if (copyToClipboard(summaryText)) {
    logger.success('Summary 已复制到剪贴板！');
    logger.info('📋 你可以直接在 changeset 中粘贴使用\n');
  } else {
    logger.warning('无法自动复制到剪贴板');
    logger.info('💡 请手动复制上面的内容\n');
  }

  // 提示下一步
  logger.info('💡 下一步：');
  logger.info('   1. 运行 `pnpm v:cs`');
  logger.info('   2. 选择受影响的包');
  logger.info('   3. 选择版本类型');
  if (breakingChanges.length > 0) {
    logger.warning('注意：检测到 Breaking Changes，建议选择 major 版本');
  }
  logger.info('   4. 粘贴上面的 summary\n');
}

// 执行主函数
try {
  generateChangesetDraft();
} catch (error) {
  logger.error('发生错误:', error.message);
  process.exit(1);
}
